package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**流---专门处理数据传输为:文本
 *高级流---处理文本---"转换流"
 *字符流:针对读写抽象类【Reoder抽象类  Writer抽象类】
 *
 * 节点流与字符流区别：单位进行区分，节点流最小单位：字节
 *                             字符流最小单位:字符
 *
 * 高级流【转换流】功能:处理文本内容
 * 字符流的子实现类:InputStreamReader  继承Reader抽象类  读入操作
 *                OutputStreamWriter   继承 Writer抽象类  写入操作
 * 高级流--->转换流【字符流】  按照功能划分--->处理文本读写操作
 * 功能：处理节点又可以被其他流所处理，类转换器
 */
public class IOSAPI {
    /**
     * 从API文件中 写出 osw.txt文件---一行文本
     */
    @Test
    public void testOSW() throws IOException {
        FileOutputStream fos = null;//低级流  搬运数据
        OutputStreamWriter osw = null;//高级流  转换流  套低级流  套其他高级流
        //2.捕获流的所有异常
        try {
            fos = new FileOutputStream("osw.txt");
            osw = new OutputStreamWriter(fos);//转换流：套低级流  套其他高级流
            //3.转换流中方法 write() 直接写出文本内容,不需要把文本转换为二进制
            //高级流---转换流---字符流
            osw.write("给jett起把大狙");
            osw.write("666\n");//省去传字节数组
            osw.write("离子大狙"); //换行
        } catch (FileNotFoundException e) {//路径错、文件写错
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally { //必须关闭 有高级流 关高级流
            if(osw!=null)
                osw.close();
        }
    }

    /**
     * Writer抽象类---子实现类： OutputStreamWriter    字符输出流       以字符形式写出
     * Reader抽象类---子实现类： InputStreamReader     字符输出流       不是以字符形式读入
     * int   二进制
     * 【无法直接读取字符串】
     * 高级流：针对转换流中InputStreamReader无法直接读入字符串
     * BufferedWriter----直接套在转换流上的高级流     缓冲输出流
     * BufferedReader----直接套在转换流上的高级流     缓冲输入流
     * 特点：可以按照行的形式进行读取字符串【换行文件读取完毕】
     * <p>
     * 转换流中出现异常：UnsupportedEncodingException编码集转换异常
     * 产生原因：转换流【字符输入/输出流】指定编码集不对称
     * IOException      IO型大异常
     *
     */


    @Test
    public void testISR()  {
        //1.流进行置空     方便后面赋值以及关闭操作
        FileInputStream fis = null;
        InputStreamReader isr = null; //转换流指定编码集，无法读取字符串
        BufferedReader br = null;    //缓冲输入流：解决  读取字符串
        //2.捕获流当中的异常
        try {
            fis = new FileInputStream("osw.txt");
            isr = new InputStreamReader(fis, "UTF8");   //转换流   字符输出流
            //功能：构造器第二个参数，添加编码集：UTF8  识别文字  万国码
            //先尝试调取   输出流   读方法---读取一段字符
            br = new BufferedReader(isr);  //缓冲输入流
            /**
             * readLine()读取若字符串，直到读到读完为止【没有换行符】
             * 读取数据返回值字符串
             * 如果返回值不为null，表示所有数据没有读取完毕
             *            为null，表示数据读取完毕【没有换行符】
             */
            //①定义引用类型的变量
            String line=null;
            //②【一直】读取一行文本保存line中，判断line不为空---输出文本
            //(line=br.readLine())!=null
            while ( (line=br.readLine())!=null ){
                System.out.println(line);
            }
            //String str = br.readLine();
            //System.out.println("读取到的数据：" + str);
        } catch (FileNotFoundException e) {//文件不存在
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {//编码集异常
            e.printStackTrace();
        } catch (IOException e) {//IO流异常
            e.printStackTrace();
        } finally {
            //关闭高级流
            if (br!=null)
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }


    /**
     * 作业2： 读取IOSAPI.java   文件到控制台  ，指定编码集：UTF8     万国码
     *       提示：按照从上到下执行逻辑--标准流：IO+异常捕获
     *
     */
    @Test
    public void testHomeWork2() {
        //1.创建一个低级流----针对读操作----【找到IOSAPI.java文件】
        FileInputStream fis = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
//maven项目---src\main\java\com\tedu\api\io\IOSAPI.java
        try {
            fis = new FileInputStream("src\\main\\java\\com\\tedu\\api\\io\\IOSAPI.java");
            //2.创建转换流----指定编码集：UTF8  【不能直接输出字符串】
            isr = new InputStreamReader(fis, "UTF8");
            br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
             //3.【能直接输出字符串】创建缓冲   流
              //4.创建保存每行字符串的变量
           //String line=null;

         //5.一直  读取字符串，不等于null  有字符串--同时写出
        //6.关闭流
    }
    /**
     * 高级流--特殊：①直接创建高级流对象
     *             ②不是成对----BufferReader
     *             ③直接写出文本
     * PrintWriter字符输出流   直接替代 BufferedWriter
     * 需求：从程序写出   pw.txt  文件    指定编码集：UTF-8，输出几行文本
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
        //创建高级流:套三个流  FileOutputStream   低级流    搬运数据
        //                 OutputStreamWriter   高级流   转换流  指定编码集
        //                  BufferedWriter       高级流   套在转换流上   效率写
        PrintWriter pw=new PrintWriter("pw.txt","utf8");
        //print()   输出一行文本，不换行     println()  输出一行文本  换行
        pw.print("你是");
        pw.println("我的sb");
        pw.close();
    }
}